﻿using ModelEntities;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ModelEntities.Tracabilite
{
    /// <summary>
    /// Classe métier reprenant les données des lignes détails d'une traçabilité du PV
    /// </summary>
    public class Traçabilite : INotifyPropertyChanged,
                                             IBuilt 
    {
        #region Attribut(s)

        #region Attributs DC

        private String dr1;
        private String dr2;
        private String dr3;
        private String dr4;
        private String dr5;
        private String dr6;
        private String dr7;
        private String dr8;
        private String dr9;
        private String dr10;
        private String dr11;
        private String dr12;

        #endregion

        private readonly int[] tailleChamp = new int[12] { 8, 11, 28, 12, 15, 4, 4, 4, 4, 5, 5, 5 };

        #endregion

        #region Propriété(s)

        #region DRs

        public String DR1
        {
            get { return dr1; }
            set { dr1 = value; OnPropertyChanged("DR1"); }
        }

        public String DR2
        {
            get { return dr2; }
            set { dr2 = value; OnPropertyChanged("DR2"); }
        }

        public String DR3
        {
            get { return dr3; }
            set { dr3 = value; OnPropertyChanged("DR3"); }
        }

        public String DR4
        {
            get { return dr4; }
            set { dr4 = value; OnPropertyChanged("DR4"); }
        }

        public String DR5
        {
            get { return dr5; }
            set { dr5 = value; OnPropertyChanged("DR5"); }
        }

        public String DR6
        {
            get { return dr6; }
            set { dr6 = value; OnPropertyChanged("DR6"); }
        }

        public String DR7
        {
            get { return dr7; }
            set { dr7 = value; OnPropertyChanged("DR7"); }
        }

        public String DR8
        {
            get { return dr8; }
            set { dr8 = value; OnPropertyChanged("DR8"); }
        }

        public String DR9
        {
            get { return dr9; }
            set { dr9 = value; OnPropertyChanged("DR9"); }
        }

        public String DR10
        {
            get { return dr10; }
            set { dr10 = value; OnPropertyChanged("DR10"); }
        }

        public String DR11
        {
            get { return dr11; }
            set { dr11 = value; OnPropertyChanged("DR11"); }
        }

        public String DR12
        {
            get { return dr12; }
            set { dr12 = value; OnPropertyChanged("DR12"); }
        }

        #endregion

        public Int32 NoPage
        {
            get;
            set;
        }

        #endregion

        #region Constructeur(s)

        public Traçabilite(Int32 noPage)
        {
            NoPage = noPage;
            Init();
        }

        private void Init()
        {
            this.DR1 = String.Empty;
            this.DR2 = String.Empty;
            this.DR3 = String.Empty;
            this.DR4 = String.Empty;
            this.DR5 = String.Empty;
            this.DR6 = String.Empty;
            this.DR7 = String.Empty;
            this.DR8 = String.Empty;
            this.DR9 = String.Empty;
            this.DR10 = String.Empty;
            this.DR11 = String.Empty;
            this.DR12 = String.Empty;
        }

        #endregion

        #region Méthode(s)

        /// <summary>
        /// Permet de completer l'attribut avec des espaces à la fin si celui ci n'et pas égale à length.
        /// Si attribute.Length > length, la chaine retourné est tronquée
        /// </summary>
        /// <param name="attribute">Attribut à compléter</param>
        /// <param name="length">Longueur souhaité de l'attribut transformé</param>
        /// <returns>Retourne le résultat de l'opération de transformation</returns>
        private String CompleteWithSpace(String attribute, int length)
        {
            if (attribute.Length > length)
                return attribute.Substring(0, length);
            else
                return attribute.PadRight(length, ' ');
        }

        #endregion

        #region Implements INotifyPropertyChanged

        /** Permet de notifier les élements grapghiques qui sont bindés dessus, en cas de modification **/
        public event PropertyChangedEventHandler PropertyChanged;
        private void OnPropertyChanged(String info)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(info));
            }
        }

        #endregion

        #region Implements IBuilt

        /// <summary>
        /// Permet de charger une liste d'objet dans cette instance
        /// </summary>
        /// <param name="listObjects">Liste d'objet à charger</param>
        public void Objects(List<object> listObjects)
        {
            int ind = 0;

            this.DR1 = Convert.ToString(listObjects[ind++]).TrimEnd(' ');
            this.DR2 = Convert.ToString(listObjects[ind++]).TrimEnd(' ');
            this.DR3 = Convert.ToString(listObjects[ind++]).TrimEnd(' ');
            this.DR4 = Convert.ToString(listObjects[ind++]).TrimEnd(' ');
            this.DR5 = Convert.ToString(listObjects[ind++]).TrimEnd(' ');
            this.DR6 = Convert.ToString(listObjects[ind++]).TrimEnd(' ');
            this.DR7 = Convert.ToString(listObjects[ind++]).TrimEnd(' ');
            this.DR8 = Convert.ToString(listObjects[ind++]).TrimEnd(' ');
            this.DR9 = Convert.ToString(listObjects[ind++]).TrimEnd(' ');
            this.DR10 = Convert.ToString(listObjects[ind++]).TrimEnd(' ');
            this.DR11 = Convert.ToString(listObjects[ind++]).TrimEnd(' ');
            this.DR12 = Convert.ToString(listObjects[ind++]).TrimEnd(' ');
        }

        /// <summary>
        /// Permet de reconstitué la ligne formatté des compositions chimiques pour pouvoir être mise à jour en BDD
        /// </summary>
        /// <returns>Retourne un objet de type String correctement formatté</returns>
        public object TransformBack()
        {
            StringBuilder build = new StringBuilder();
            build.Append(CompleteWithSpace(this.DR1, tailleChamp[0])).Append(";");
            build.Append(CompleteWithSpace(this.DR2, tailleChamp[1])).Append(";");
            build.Append(CompleteWithSpace(this.DR3, tailleChamp[2])).Append(";");
            build.Append(CompleteWithSpace(this.DR4, tailleChamp[3])).Append(";");
            build.Append(CompleteWithSpace(this.DR5, tailleChamp[4])).Append(";");
            build.Append(CompleteWithSpace(this.DR6, tailleChamp[5])).Append(";");
            build.Append(CompleteWithSpace(this.DR7, tailleChamp[6])).Append(";");
            build.Append(CompleteWithSpace(this.DR8, tailleChamp[7])).Append(";");
            build.Append(CompleteWithSpace(this.DR9, tailleChamp[8])).Append(";");
            build.Append(CompleteWithSpace(this.DR10, tailleChamp[9])).Append(";");
            build.Append(CompleteWithSpace(this.DR11, tailleChamp[10])).Append(";");
            build.Append(CompleteWithSpace(this.DR12, tailleChamp[11])).Append(";");
            build.Append(";");

            return build.ToString();
        }

        /// <summary>
        /// Permet de vérifier le bon format des données saisies par l'utilisateur
        /// </summary>
        /// <returns></returns>
        public String VerifyDataEntry()
        {
            StringBuilder sb = new StringBuilder();
            sb.Append(this.DR1.Length <= tailleChamp[0] ? String.Empty : String.Format("La cellule N°1 ne doit pas dépasser {0} caractères\n", tailleChamp[0]));
            sb.Append(this.DR2.Length <= tailleChamp[1] ? String.Empty : String.Format("La cellule N°2 ne doit pas dépasser {0} caractères\n", tailleChamp[1]));
            sb.Append(this.DR3.Length <= tailleChamp[2] ? String.Empty : String.Format("La cellule N°3 ne doit pas dépasser {0} caractères\n", tailleChamp[2]));
            sb.Append(this.DR4.Length <= tailleChamp[3] ? String.Empty : String.Format("La cellule N°4 ne doit pas dépasser {0} caractères\n", tailleChamp[3]));
            sb.Append(this.DR5.Length <= tailleChamp[4] ? String.Empty : String.Format("La cellule N°5 ne doit pas dépasser {0} caractères\n", tailleChamp[4]));
            sb.Append(this.DR6.Length <= tailleChamp[5] ? String.Empty : String.Format("La cellule N°6 ne doit pas dépasser {0} caractères\n", tailleChamp[5]));
            sb.Append(this.DR7.Length <= tailleChamp[6] ? String.Empty : String.Format("La cellule N°7 ne doit pas dépasser {0} caractères\n", tailleChamp[6]));
            sb.Append(this.DR8.Length <= tailleChamp[7] ? String.Empty : String.Format("La cellule N°8 ne doit pas dépasser {0} caractères\n", tailleChamp[7]));
            sb.Append(this.DR9.Length <= tailleChamp[8] ? String.Empty : String.Format("La cellule N°9 ne doit pas dépasser {0} caractères\n", tailleChamp[8]));
            sb.Append(this.DR10.Length <= tailleChamp[9] ? String.Empty : String.Format("La cellule N°10 ne doit pas dépasser {0} caractères\n", tailleChamp[9]));
            sb.Append(this.DR11.Length <= tailleChamp[10] ? String.Empty : String.Format("La cellule N°11 ne doit pas dépasser {0} caractères\n", tailleChamp[10]));
            sb.Append(this.DR12.Length <= tailleChamp[11] ? String.Empty : String.Format("La cellule N°12 ne doit pas dépasser {0} caractères\n", tailleChamp[11]));

            return sb.ToString();
        }

        #endregion
    }
}
